[DUVIDA] usando o SED em uma system call !

1. [DUVIDA] usando o SED em uma system call !

Renan
daekss

(usa Ubuntu)

Enviado em 01/06/2012 - 14:40h

Pessoal, estou tendo um probleminha para usar o sed na função system();
Preciso localizar e substituir uma palavra dentro de um arquivo usando uma chamada de sistema, nada melhor que o sed.
Quando uso desta forma, obtenho sucesso:

system("sed -i 's/palavraantiga/palavranova/g' teste.txt");

eu consigo substituir a palavraantiga pela palavranova no arquivo teste.txt


O problema, é que ele só funciona se eu digitar essas palavras e o nome do arquivo diretamente nessa função system com o sed.

Se eu tento colocar através de uma variável, por exemplo:

int main()
{
char pantiga[40];
char pnova[40];
char nomearquivo[40];

gets(pantiga);
gets(pnova);
gets(nomearquivo);

system("sed -i 's/pantiga/pnova/g' nomearquivo");

}

ele nao funciona pessoal ! ele nao consegue ler o conteúdo dessas variáveis. ja tentei de várias formas, inclusive com ponteiros.

Alguem me sugere um jeito de fazer isso funcionar ?


  


2. Re: [DUVIDA] usando o SED em uma system call !

Perfil removido
removido

(usa Nenhuma)

Enviado em 01/07/2012 - 22:57h

Aqui este código deu certo, desde que exemplo.txt exista.
As strings foram colocadas para teste dentro do arquivo.
Este código foi compilado e testado.
A substituição estava feita dentro do arquivo quando olhei.

main () {

char *x = "sed -i 's/pantiga/pnova/g' exemplo.txt";

system (x);

}



3. Re: [DUVIDA] usando o SED em uma system call !

Marcos Paulo Ferreira
daemonio

(usa Slackware)

Enviado em 03/10/2012 - 10:10h

Olá,

Nesse caso, você terá que usar outra variável para armazenar seus comandos. O uso da sprintf é bem interessante:


int main()
{
char pantiga[40];
char pnova[40];
char nomearquivo[40];

char comandosed[BUFSIZ] ;

gets(pantiga); /* gets nããão */
gets(pnova);
gets(nomearquivo);

/* Monta o comando */
sprintf(comandosed, "/bin/sed -i 's/%s/%s/g' %s", pantiga, pnova, nomearquivo) ;

/* system invoca o bash.. por isso é bom verificar as variáveis
de entrada a procura de caracteres especiais (ex: >, <, *, etc).
Chamando a sys call exec*() seria mais seguro nesse caso.
*/
system(comandosed);

}


Sei que o post é antigo, porém sempre que resolver um problema, seja pelo o fórum ou por outro lugar, é bom marcá-lo como [RESOLVIDO].

Abraços
t+






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts